001 /* 002 * Created by IntelliJ IDEA. 003 * User: Wei Wang 004 * Date: 2002-9-12 005 * Time: 13:58:40 006 * To change template for new class use 007 * Code Style | Class Templates options (Tools | IDE Options). 008 */ 009 package EVolve.util; 010 011 import EVolve.visualization.*; 012 import EVolve.Scene; 013 import javax.swing.*; 014 import javax.swing.event.InternalFrameAdapter; 015 import javax.swing.event.InternalFrameEvent; 016 import java.awt.geom.Point2D; 017 import java.awt.image.BufferedImage; 018 import java.awt.*; 019 020 021 public class Magnifier implements Cloneable{ 022 private JInternalFrame window; 023 private JDesktopPane desktop; 024 private AxesPanel magnifiedPanel; 025 private Point2D.Double mousePosition; 026 private Rectangle imageBounds; 027 private boolean flipImage; 028 029 public Magnifier(boolean flipImage) { 030 window = null; 031 desktop = Scene.getUIManager().getDesktop(); 032 mousePosition = new Point2D.Double(-1,-1); 033 this.flipImage = flipImage; 034 } 035 036 private void createWindow() { 037 if (window == null) { 038 window = new JInternalFrame("Zoomed View"); 039 window.addInternalFrameListener(new InternalFrameAdapter() { 040 public void internalFrameClosing(InternalFrameEvent e) { 041 window = null; 042 } 043 }); 044 /*window.addInternalFrameListener(new InternalFrameAdapter() { 045 public void internalFrameDeactivated(InternalFrameEvent e) { 046 cleanup(); 047 } 048 });*/ 049 window.setClosable(true); 050 int flag = AxesPanel.Pointer_Enabled | AxesPanel.Scale_Image; 051 if (flipImage) 052 flag = flag | AxesPanel.Flip_Image; 053 magnifiedPanel = new AxesPanel(flag); 054 window.setBounds(desktop.getSize().width - 400, 0, 300, 300); 055 window.setResizable(true); 056 window.getContentPane().add(magnifiedPanel); 057 desktop.add(window); 058 mousePosition.setLocation(magnifiedPanel.getWidth()/2,magnifiedPanel.getHeight()/2); 059 } 060 window.moveToFront(); 061 window.setVisible(true); 062 } 063 064 public void showWindow(BufferedImage subImage) { 065 createWindow(); 066 067 int w = magnifiedPanel.getWidth(); 068 int h = magnifiedPanel.getHeight(); 069 if ((w*h != 0)&&(subImage!=null)) { 070 imageBounds = new Rectangle(0,0,subImage.getWidth(),subImage.getHeight()); 071 072 magnifiedPanel.setImage(subImage); 073 magnifiedPanel.setPointerPosition((int)Math.round(mousePosition.x), (int)Math.round(mousePosition.y)); 074 magnifiedPanel.repaint(); 075 if (!window.isVisible()) { 076 try { 077 window.show(); 078 window.setVisible(true); 079 } catch (Exception e) {} 080 } 081 } 082 } 083 084 public void convertMousePosition(AxesPanel zoomed) { 085 if ((magnifiedPanel == null) || (magnifiedPanel.getWidth() == 0)) { 086 return; 087 } 088 int w = magnifiedPanel.getWidth(), h = magnifiedPanel.getHeight(); 089 090 091 Point2D.Double mousePos = zoomed.getMouseMovement(); 092 //double pixel_x_size = (double)zoomed.getWidth()/imageBounds.getWidth(); 093 //double pixel_y_size = (double)zoomed.getHeight()/imageBounds.getHeight(); 094 095 int guessX = 0, guessY = 0; 096 while (guessX<w) { 097 if (magnifiedPanel.getImageX(guessX) == mousePos.x) break; 098 guessX++; 099 } 100 while (guessY<h){ 101 if (magnifiedPanel.getImageY(guessY) == mousePos.y) break; 102 guessY++; 103 } 104 105 mousePosition.setLocation(guessX+3,guessY+3); 106 } 107 108 public void cleanup() { 109 try { 110 window.dispose(); 111 window.setVisible(false); 112 window = null; 113 } catch (Exception e) {} 114 } 115 116 public Object clone() { 117 Magnifier o = null; 118 try { 119 o = (Magnifier)super.clone(); 120 } catch (CloneNotSupportedException e) { 121 e.printStackTrace(); 122 return null; 123 } 124 o.magnifiedPanel = (AxesPanel)magnifiedPanel.clone(); 125 return o; 126 } 127 }